package client.domein;

import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.ArrayList;

import client.gui.DammenFrame;

import core.domein.TCPDataListener;
import core.net.TCPClient;

/**
 * Klasse die alles ontvangt, ontleed en doorstuurt
 * @author Van Wayenbergh David
 */

public class ChatController implements TCPDataListener
{
	private TCPClient tcp;
	private ChatListener listener;
	private String name;
	
	public ChatController()
	{
		tcp = new TCPClient(1234, "localhost");
		ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
		threadExecutor.execute(tcp);
		tcp.addTCPDataListener(this);
	}
	
	/**
	 * methode voor het toevoegen van een listener
	 * @param listener de toe te voegen listener
	 */
	public void addChatListener(ChatListener listener)
	{
		this.listener = listener;
	}
	
	/**
	 * methode voor het versturen van gegevens
	 * @param message de te versturen data
	 */
	public void send(Object message)
	{
		tcp.sendData(message);
	}
	
	/**
	 * methode voor het ontleden van binnengekomen data
	 * @param source client van wie de data afkomstig is
	 * @param data bevat het binnengekomen bericht
	 */
	public void dataReceived(TCPClient source, Object data)
	{
		if(data.getClass().getName().equals("java.lang.String"))
		{
			String hulp = data.toString();
			if (hulp.startsWith("(an)"))
			{	
				// Afhandeling antwoord naam
				if (hulp.equals("(an)bad"))
				{
					listener.nameBad();
				}
				else
				{
					listener.nameGood();
				}
			}
			else
			{
				// Afhandeling antwoord IP
				if (hulp.startsWith("(AI)"))
				{
					String ip = hulp.substring(4);
					listener.startDammen(ip, name);
				}
				else
				{	
					if(hulp.startsWith("(RD)"))
					{
						//afhandeling aanvraag om te dammen
						listener.challengeReceived(hulp.substring(4));
					}
					else
					{
						// Afhandeling antwoord om te dammen
						if(hulp.startsWith("(AD)"))
						{
							String nameT = hulp.substring(4);
							String[] parameters = nameT.split(":");
							if (parameters[1].equals("accept"))
							{
								tcp.sendData("(RI)"+parameters[0]);
							}
							else
							{
								listener.refuseChallenge(parameters[0]);
							}
								
						}
						else
						{
							listener.dataReceived(hulp);
						}
					}
				}
			}
		}
		else
		{
			// eigen naam uit lijst verwijderen
			ArrayList <String> gebruikers = (ArrayList<String>)(data);
			gebruikers.remove(name);
			listener.listReceived(gebruikers.toArray());
		}
	}
	
	public void clientConnected(TCPClient client)
	{
		
	}
	public void clientDisconnected(TCPClient client)
	{
		
	}
	
	/**
	 * methode voor een naam aan te vragen
	 * @param name de aan te vragen naam
	 */
	public void requestName(String name)
	{
		tcp.sendData("(rn)"+name);
	}
	
	/**
	 * naam opslaan
	 * @param n bevat de naam
	 */
	public void setName(String n)
	{
		this.name = n;
	}
	
	/**
	 * naam opvragen
	 * @return String
	 */
	public String getName()
	{
		return name;
	}
	
	/**
	 * afsluiten van een client
	 */
	public void exit()
	{
		tcp.exit();
	}
}
